package com.example.springboot.spring.conf;

import org.springframework.web.socket.BinaryMessage;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;

import java.net.URI;
import java.time.LocalDateTime;

/**
 * 编写 WebSocket 服务端
 * <p>继承 spring 的 TextWebSocketHandler，重写其中的方法
 * <p>
 *
 * @author Zhang.Z
 * @version 2025-09-21
 */
public class MyWebSocketHandler extends TextWebSocketHandler {


    /**
     * 是在 socket 连接成功后被触发，同原生注解里的 @OnOpen 功能
     */
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        System.out.println("有新连接加入: " + session.getId());
        //todo 这块会实现自己业务，比如，当用户登录后，会把离线消息推送给用户

        URI uri = session.getUri(); // ws://127.0.0.1:8090/webSocket?username=root
        if (uri != null && uri.getQuery() != null) {
            String query = uri.getQuery(); // "username=root"
            System.out.println("query = " + query);

            // 解析成 map
            String[] params = query.split("&");

            String[] kv = params[0].split("=");
            System.out.println(kv[0] + " : " + kv[1]);
            session.sendMessage(new TextMessage(kv[0] + " : " + kv[1] + " 已连接"));
        } else {
            session.sendMessage(new TextMessage("已连接"));
        }


    }

    /**
     * 在客户端发送普通文件信息时触发，同原生注解里的 @OnMessage 功能
     */
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        // 获得客户端传来的消息
        String payload = message.getPayload();
        System.out.println(payload);
        //发生消息
        session.sendMessage(new TextMessage("server 发送给的消息" + LocalDateTime.now().toString()));
    }

    /**
     * 在客户端发送二进制信息时触发，同原生注解里的 @OnMessage 功能
     */
    @Override
    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) {

    }

    /**
     * 发生异常时，同原生注解里的 @OnError
     */
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        System.out.println("传输出现异常: " + exception.getMessage());
    }

    /**
     * 在 socket 连接关闭后被触发，同原生注解里的 @OnClose 功能
     */
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        System.out.println("连接关闭: " + session.getId());
    }
}
